package com.zby.lease.web.admin.custom.converter;

import com.zby.lease.model.enums.BaseEnum;
import org.springframework.core.convert.converter.Converter;
import org.springframework.core.convert.converter.ConverterFactory;
import org.springframework.stereotype.Component;

@Component
public class StringToEnumConverterFactory implements ConverterFactory<String, BaseEnum> {
    /**
     * 获取一个转换器，用于将字符串转换为指定的枚举类型
     * 此方法主要用于处理基于代码的枚举转换，通过反射获取枚举常量并进行匹配
     *
     * @param targetType 目标枚举类型的Class对象，用于指定要转换成的枚举类型
     * @param <T> 泛型参数，表示任何继承自BaseEnum的枚举类型
     * @return 返回一个转换器，能够将字符串转换为指定的枚举类型
     * @throws IllegalArgumentException 如果源字符串不匹配任何枚举代码，则抛出此异常
     */
    @Override
    public <T extends BaseEnum> Converter<String, T> getConverter(Class<T> targetType) {
        return new Converter<String, T>() {
            /**
             * 将源字符串转换为指定的枚举类型
             * 此方法遍历枚举常量，寻找与源字符串匹配的代码，然后返回对应的枚举实例
             * 如果找不到匹配的代码，则抛出IllegalArgumentException异常
             *
             * @param source 表示枚举代码的字符串，将被转换为枚举类型
             * @return 转换后的枚举实例
             * @throws IllegalArgumentException 如果源字符串不匹配任何枚举代码
             */
            @Override
            public T convert(String source) {
                // 遍历目标类型的枚举常量
                for (T targetTypeEnum : targetType.getEnumConstants()){
                    // 检查枚举常量的代码是否与源字符串匹配
                    if (targetTypeEnum.getCode().equals(Integer.valueOf(source))){
                        // 如果匹配，则返回对应的枚举实例
                        return targetTypeEnum;
                    }
                }
                // 如果没有找到匹配的枚举代码，则抛出异常
                throw new IllegalArgumentException("code非法");
            }
        };
    }
}
